﻿using System; // 引用系统基础命名空间
using System.Collections.Generic; // 引用泛型集合命名空间
using System.Drawing; // 引用绘图与尺寸相关命名空间
using System.ComponentModel; // 设计期检测
using System.Windows.Forms;
using System.Net.Http; // 引用HTTP客户端命名空间
using System.Threading.Tasks; // 引用异步任务命名空间
using Newtonsoft.Json; // 引用JSON序列化命名空间
using System.Text; // 引用文本处理命名空间
using Mes.Production.Models; // 引用WinForms控件命名空间
using Mes.Production.Config; // 引用配置管理命名空间
using Mes.Production.Common; // 引用通用API响应模型
using Mes; // 使用 HttpClientHelper

namespace Mes.Production // 命名空间：生产模块
{
    /// <summary> // 说明文档：选择成品对话框
    /// 选择成品对话框（支持多选，只读，自适应布局） // 描述功能
    /// </summary> // 文档结束
    public partial class SelectMaterialDialog : Form // 声明为partial以兼容Designer分部类
    {
        // 外部读取所选数据 // 注：仅get公开
        public List<MaterialInfo> SelectedMaterials { get; private set; } // 选择结果列表

        // 切换为使用 HttpClientHelper

        public SelectMaterialDialog() // 构造函数
        {
            InitializeComponent(); // 使用设计器生成的控件
            MaximizeBox = true; // 允许最大化（设计器未设置）

            // 使用 HttpClientHelper 统一调用，无需在此初始化 HttpClient

            // 注册窗体加载事件
            this.Load += SelectMaterialDialog_Load;

            // 若无列则补充列（防止重复添加）
            if (dgv.Columns.Count == 0)
            {
                dgv.Columns.Add(new DataGridViewTextBoxColumn { Name = "Id", HeaderText = "物料ID", Width = 60, ReadOnly = true });
                dgv.Columns.Add(new DataGridViewTextBoxColumn { Name = "FinishedNo", HeaderText = "成品编号", Width = 120, ReadOnly = true });
                dgv.Columns.Add(new DataGridViewTextBoxColumn { Name = "FinishedName", HeaderText = "成品名称", Width = 150, ReadOnly = true });
                dgv.Columns.Add(new DataGridViewTextBoxColumn { Name = "SpecificationModel", HeaderText = "规格型号", Width = 120, ReadOnly = true });
                dgv.Columns.Add(new DataGridViewTextBoxColumn { Name = "Unit", HeaderText = "单位", Width = 80, ReadOnly = true });
            }

            // 初始化表格基础属性（以设计器为主，这里兜底）
            dgv.AllowUserToAddRows = false;
            dgv.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
            dgv.MultiSelect = true;
            dgv.ReadOnly = true;

            // 移除示例数据，改为在窗体加载时通过API获取动态数据

            // 事件绑定
            btnOk.Click += (s, e) =>
            {
                if (dgv.SelectedRows != null && dgv.SelectedRows.Count > 0)
                {
                    SelectedMaterials = new List<MaterialInfo>();
                    foreach (DataGridViewRow r in dgv.SelectedRows)
                    {
                        if (r.IsNewRow) continue;
                        SelectedMaterials.Add(new MaterialInfo
                        {
                            Id = Convert.ToInt32(r.Cells["Id"].Value),
                            FinishedNo = Convert.ToString(r.Cells["FinishedNo"].Value),
                            FinishedName = Convert.ToString(r.Cells["FinishedName"].Value),
                            SpecificationModel = Convert.ToString(r.Cells["SpecificationModel"].Value),
                            Unit = Convert.ToString(r.Cells["Unit"].Value)
                        });
                    }
                    DialogResult = DialogResult.OK;
                }
                else
                {
                    MessageBox.Show("请至少选择一条成品", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            };

            btnCancel.Click += (s, e) => { DialogResult = DialogResult.Cancel; };
        } // 构造函数结束

        /// <summary>
        /// 窗体加载事件，获取成品数据
        /// </summary>
        private async void SelectMaterialDialog_Load(object sender, EventArgs e)
        {
            try
            {
                // 显示加载状态
                this.Cursor = Cursors.WaitCursor;

                // 调用API获取成品数据
                var result = await GetFinishedProductListAsync();

                if (result != null && result.Code == 200 && result.Data != null)
                {
                    // 清空现有数据
                    dgv.Rows.Clear();

                    // 填充API返回的数据
                    foreach (var item in result.Data)
                    {
                        dgv.Rows.Add(
                            item.Id,
                            item.FinishedNo ?? "",
                            item.Name ?? "",
                            item.SpecificationModel ?? "",
                            item.Unit ?? ""
                        );
                    }
                }
                else
                {
                    // API调用失败，显示错误信息
                    var errorMsg = result?.Msg ?? "获取成品数据失败";
                    MessageBox.Show(errorMsg, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show($"获取成品数据时发生错误：{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                // 恢复光标状态
                this.Cursor = Cursors.Default;
            }
        }

        /// <summary>
        /// 调用后端API获取成品信息列表
        /// </summary>
        /// <returns>API响应结果</returns>
        private async Task<ApiResponse<List<FinishedProductInfoDto>>> GetFinishedProductListAsync()
        {
            try
            {
                var apiUrl = ApiConfig.GetApiBaseUrl();
                var url = $"{apiUrl}/api/ProductionOrder/GetFinishedProductList";
                var responseContent = await HttpClientHelper.ClientAsync("GET", url, false, null);

                // 解析API响应
                var result = JsonConvert.DeserializeObject<ApiResponse<List<FinishedProductInfoDto>>>(responseContent);
                if (result != null)
                {
                    return result;
                }

                // 解析失败时，返回统一失败结构
                return new ApiResponse<List<FinishedProductInfoDto>>
                {
                    Code = 500,
                    Msg = $"请求失败: {responseContent}"
                };
            }
            catch (TaskCanceledException)
            {
                return new ApiResponse<List<FinishedProductInfoDto>>
                {
                    Code = 408,
                    Msg = "请求超时，请检查网络连接"
                };
            }
            catch (Exception ex)
            {
                return new ApiResponse<List<FinishedProductInfoDto>>
                {
                    Code = 500,
                    Msg = $"请求异常: {ex.Message}"
                };
            }
        }


    } // 类结束
} // 命名空间结束
